#include <iostream>
#include <string>
#include "Person.pb.h"

int main(int argc, char *argv[])
{
    // 序列化
    MyPerson::Person p;
    p.set_id(1);
    p.set_name("小明");
    p.set_sex("man");
    p.set_age(26);


    // 通过mutable_addr函数获得私有成员变量地址后，再通过地址去设置数据
    MyAddress::Address *mAddr = p.mutable_addr();
    mAddr->set_num(111);
    mAddr->set_addr("广东省广州市");
    mAddr->set_key(MyAddress::KeyBoard::D);


    std::string output = "";
    // 序列化对象，最终得到一个二进制字符串
    p.SerializeToString(&output);



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    // 反序列化
    MyPerson::Person pp;
    pp.ParseFromString(output);

    std::cout << "id = " << pp.id() << std::endl;
    std::cout << "name = " << pp.name() << std::endl;
    std::cout << "age = " << pp.age() << std::endl;
    std::cout << "sex = " << pp.sex() << std::endl;

    // 可通过addr函数结构，再进行下一步的获取值
    const MyAddress::Address &tmpAddr = pp.addr();
    std::cout << "num = " << tmpAddr.num() << std::endl;
    std::cout << "addr = " << tmpAddr.addr() << std::endl;
    std::cout << "key = " << tmpAddr.key() << std::endl;

    return 0;
}
